package com.itzhouwei.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @description: 解码器
 * @author：zw，微信：yingshengzw
 * @date: 2023/10/28 20:34
 * @Copyright： 公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、分享、成长，让自己和他人都能有所收获！
 */
public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> genericClass;

    public RpcDecoder(Class<?> genericClass){
        this.genericClass=genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        //请求数据包 不足4个字节 直接返回   如果大于等于4个字节 那么程序正常执行
        if (in.readableBytes()<4){
            return;
        }
        //记录一下当前的位置
        in.markReaderIndex();
        //当前请求数据包的大小读取出来
        int dataLength=in.readInt();
        if (in.readableBytes()<dataLength){
             in.resetReaderIndex();
             return;
        }
        //真正读取需要长度的数据包的内容
        byte[] data=new byte[dataLength];
        in.readBytes(data);
        //解码操作 返回指定的对象
        Object obj = Serialization.deserialize(data, genericClass);
        //填充到buffer中  給下游handler 做实际的处理
        out.add(obj);
    }
}
